/*
* JBoss, Home of Professional Open Source
* Copyright 2016, Red Hat, Inc. and/or its affiliates,
* and individual contributors as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2016,
* @author JBoss, by Red Hat.
*/
package org.jboss.byteman.contrib.dtest;
import org.junit.Test;
import junit.framework.Assert;
public class RuleConstructorTestCase {
@Test
public void basic() {
String testRule = String.format(
"RULE basic rule%n" +
"CLASS javax.transaction.xa.XAResource%n" +
"METHOD commit%n" +
"AT ENTRY%n" +
"IF NOT flagged(\"commitFlag\")%n" +
"DO throw new javax.transaction.xa.XAResource(100)%n" +
"ENDRULE%n");
String rule = RuleConstructor.createRule("basic rule")
.onClass("javax.transaction.xa.XAResource")
.inMethod("commit")
.atEntry()
.ifCondition("NOT flagged(\"commitFlag\")")
.doAction("throw new javax.transaction.xa.XAResource(100)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, rule);
}
@Test
public void basicWithSubclasses() {
String testRule = String.format(
"RULE basic rule%n" +
"CLASS ^javax.transaction.xa.XAResource%n" +
"METHOD rollback%n" +
"AT EXIT%n" +
"IF NOT flagged(\"commitFlag\")%n" +
"DO throw new javax.transaction.xa.XAResource(100)%n" +
"ENDRULE%n");
String rule = RuleConstructor.createRule("basic rule")
.onClass("javax.transaction.xa.XAResource")
.includeSubclases()
.inMethod("rollback")
.atExit()
.ifCondition("NOT flagged(\"commitFlag\")")
.doAction("throw new javax.transaction.xa.XAResource(100)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, rule);
}
@Test
public void withBind() {
String testRule = String.format(
"RULE bind rule%n" +
"CLASS org.my.BoundedBuffer%n" +
"METHOD <init>(int)%n" +
"AT EXIT%n" +
"HELPER org.jboss.MyHelper%n" +
"BIND buffer = $0;%n" +
"size = $1%n" +
"IF $1 < 100%n" +
"DO createCountDown(buffer, size - 1)%n" +
"ENDRULE%n");
RuleConstructor builder = RuleConstructor.createRule("bind rule")
.onClass("org.my.BoundedBuffer")
.inConstructor("int")
.atExit()
.helper("org.jboss.MyHelper")
.bind("buffer = $0", "size = $1")
.ifCondition("$1 < 100")
.doAction("createCountDown(buffer, size - 1)");
Assert.assertEquals("The rule does not match the built one", testRule, builder.build());
}
@Test
public void atLine() {
String testRule = String.format(
"RULE commit with no arguments on wst11 coordinator engine%n" +
"CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine%n" +
"METHOD State commit()%n" +
"AT LINE 324%n" +
"IF false%n" +
"DO traceStack(\"dump\", 20)%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("commit with no arguments on wst11 coordinator engine")
.onClass("com.arjuna.wst11.messaging.engines.CoordinatorEngine")
.inMethod("State commit()")
.atLine(324)
.ifFalse()
.doAction("traceStack(\"dump\", 20)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void atInvoke() {
String testRule = String.format(
"RULE at invoke%n" +
"CLASS CoordinatorEngine%n" +
"METHOD commit%n" +
"AT INVOKE sendCommit%n" +
"IF false%n" +
"DO traceStack(\"dump\", 20)%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("at invoke")
.onClass("CoordinatorEngine")
.inMethod("commit")
.atInvoke("sendCommit")
.ifFalse()
.doAction("traceStack(\"dump\", 20)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void afterRead() {
String testRule = String.format(
"RULE at invoke%n" +
"CLASS CoordinatorEngine%n" +
"METHOD commit%n" +
"AFTER READ $current%n" +
"IF false%n" +
"DO traceStack(\"dump\", 20)%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("at invoke")
.onClass("CoordinatorEngine")
.inMethod("commit")
.afterRead("$current")
.ifFalse()
.doAction("traceStack(\"dump\", 20)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void afterWrite() {
String testRule = String.format(
"RULE at invoke%n" +
"CLASS CoordinatorEngine%n" +
"METHOD commit%n" +
"AFTER WRITE $current%n" +
"IF false%n" +
"DO traceStack(\"dump\", 20)%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("at invoke")
.onClass("CoordinatorEngine")
.inMethod("commit")
.afterWrite("$current")
.ifFalse()
.doAction("traceStack(\"dump\", 20)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void atSynchronize() {
String testRule = String.format(
"RULE at invoke%n" +
"CLASS CoordinatorEngine%n" +
"METHOD commit%n" +
"AT SYNCHRONIZE%n" +
"IF false%n" +
"DO traceStack(\"dump\", 20)%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("at invoke")
.onClass("CoordinatorEngine")
.inMethod("commit")
.atSynchronize()
.ifFalse()
.doAction("traceStack(\"dump\", 20)")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void forInterface() {
String testRule = String.format(
"RULE commit with no arguments on any engine%n" +
"INTERFACE com.arjuna.wst11.messaging.engines.Engine%n" +
"METHOD commit()%n" +
"AT THROW%n" +
"IF true%n" +
"DO System.out.println(\"One ring\");%n" +
"System.out.println(\"rule them all\")%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("commit with no arguments on any engine")
.onInterface("com.arjuna.wst11.messaging.engines.Engine")
.inMethod("commit()")
.atThrow()
.ifTrue()
.doAction(
"System.out.println(\"One ring\")",
"System.out.println(\"rule them all\")")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void doThrow() {
String testRule = String.format(
"RULE countdown at commit%n" +
"CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine%n" +
"METHOD commit%n" +
"AT READ state%n" +
"IF true%n" +
"DO debug(\"throwing wrong state\");%n" +
"throw new WrongStateException()%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("countdown at commit")
.onClass("com.arjuna.wst11.messaging.engines.CoordinatorEngine")
.inMethod("commit")
.at("READ state")
.ifTrue()
.doAction(
"debug(\"throwing wrong state\")",
"throw new WrongStateException()")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
@Test
public void importNocompile() {
String testRule = String.format(
"RULE compile import example%n" +
"CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine%n" +
"METHOD prepare%n" +
"AT ENTRY%n" +
"IMPORT javax.transaction.api%n" +
"NOCOMPILE%n" +
"IF true%n" +
"DO org.my.Logger.log(runnableKlazz, System.currentTimeMillis())%n" +
"ENDRULE%n");
String builtRule = RuleConstructor.createRule("compile import example")
.onClass("com.arjuna.wst11.messaging.engines.CoordinatorEngine")
.inMethod("prepare")
.atEntry()
.nocompile()
.imports("javax.transaction.api")
.ifTrue()
.doAction("org.my.Logger.log(runnableKlazz, System.currentTimeMillis())")
.build();
Assert.assertEquals("The rule does not match the built one", testRule, builtRule);
}
}